# 05μž₯ νŒŒλ“œ

Assembled by GimunLee


# νŒŒλ“œ κ°œλ…

  • μΏ λ²„λ„€ν‹°μŠ€λŠ” νŒŒλ“œλΌλŠ” λ‹¨μœ„λ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•˜λ―€λ‘œ 보톡 μ»¨ν…Œμ΄λ„ˆ ν•˜λ‚˜κ°€ μ•„λ‹Œ μ—¬λŸ¬ 개 μ»¨ν…Œμ΄λ„ˆλ‘œ ꡬ성
  • νŒŒλ“œλ‘œ μ»¨ν…Œμ΄λ„ˆ μ—¬λŸ¬ 개λ₯Ό ν•œκΊΌλ²ˆμ— 관리할 λ•ŒλŠ” μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ 역할을 λΆ€μ—¬ν•  수 있음
  • νŒŒλ“œ ν•˜λ‚˜μ— μ†ν•œ μ»¨ν…Œμ΄λ„ˆλ“€μ€ λͺ¨λ‘ λ…Έλ“œ ν•˜λ‚˜ μ•ˆμ—μ„œ μ‹€ν–‰
  • νŒŒλ“œμ˜ μ—­ν•  쀑 ν•˜λ‚˜λŠ” μ»¨ν…Œμ΄λ„ˆλ“€μ΄ 같은 λͺ©μ μœΌλ‘œ μžμ›μ„ κ³΅μœ ν•˜λ„λ‘ ν•˜λŠ” 것
  • νŒŒλ“œ μ•ˆμ— μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ“€μ€ IP ν•˜λ‚˜λ₯Ό 곡유

# νŒŒλ“œ μ‚¬μš©ν•˜κΈ°

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod # νŒŒλ“œ 이름 μ„€μ •
  labels:
    app: kubernetes-simple-pod # 였브젝트λ₯Ό μ‹λ³„ν•˜λŠ” λ ˆμ΄λΈ”μ„ μ„€μ •
spec:
  containers:
  - name: kubernetes-simple-pod # μ»¨ν…Œμ΄λ„ˆ 이름 μ„€μ •
    image: arisu1000/simple-container-app:latest # μ»¨ν…Œμ΄λ„ˆμ— μ‚¬μš©ν•  이미지 μ„€μ •
    ports:
    - containerPort: 8080 # ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆμ— 접속할 포트

# νŒŒλ“œ 생λͺ… μ£ΌκΈ°

  • Pending: μΏ λ²„λ„€ν‹°μŠ€ μ‹œμŠ€ν…œμ— νŒŒλ“œλ₯Ό μƒμ„±ν•˜λŠ” μ€‘μž„μ„ λœ»ν•¨.
  • Running: νŒŒλ“œ μ•ˆ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ 쀑인 μƒνƒœλ‘œ 1개 μ΄μƒμ˜ μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰ μ€‘μ΄κ±°λ‚˜ μ‹œμž‘ λ˜λŠ” μž¬μ‹œμž‘ μƒνƒœ
  • Succeeded: νŒŒλ“œ μ•ˆ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ 정상 μ‹€ν–‰ μ’…λ£Œλœ μƒνƒœλ‘œ μž¬μ‹œμž‘λ˜μ§€ μ•ŠμŒ
  • Failed: νŒŒλ“œ μ•ˆ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ 쀑 μ •μƒμ μœΌλ‘œ μ‹€ν–‰ μ’…λ£Œλ˜μ§€ μ•Šμ€ μ»¨ν…Œμ΄λ„ˆκ°€ μžˆλŠ” μƒνƒœ
  • Unknown: νŒŒλ“œμ˜ μƒνƒœλ₯Ό 확인할 수 μ—†λŠ” μƒνƒœλ‘œ 보톡 νŒŒλ“œκ°€ μžˆλŠ” λ…Έλ“œμ™€ 톡신할 수 없을 λ•Œλ₯Ό λœ»ν•¨

# νŒŒλ“œ 생λͺ… μ£ΌκΈ° 확인

$ kubectl describe pods kubernetes-simple-pod

# μƒλž΅

Condition:
	Type             Status
	Initialized      True
	Ready            True
	ContainersReady  True
	PodScheduled     True
  • Initialized: λͺ¨λ“  μ΄ˆκΈ°ν™” μ»¨ν…Œμ΄λ„ˆκ°€ μ„±κ³΅μ μœΌλ‘œ μ‹œμž‘ μ™„λ£Œ
  • Ready: νŒŒλ“œλŠ” μš”μ²­λ“€μ„ μ‹€ν–‰ν•  수 있고 μ—°κ²°λœ λͺ¨λ“  μ„œλΉ„μŠ€μ˜ λ‘œλ“œλ°ΈλŸ°μ‹ 풀에 μΆ”κ°€λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 뜻
  • ContainersReady: νŒŒλ“œ μ•ˆ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ μ€€λΉ„ μƒνƒœλΌλŠ” 뜻
  • PodScheduled: νŒŒλ“œκ°€ ν•˜λ‚˜μ΄ λ…Έλ“œλ‘œ μŠ€μΌ€μ€„μ„ μ™„λ£Œν–ˆλ‹€λŠ” 뜻
  • Unschedulable: μŠ€μΌ€μ€„λŸ¬κ°€ μžμ›μ˜ λΆ€μ‘±μ΄λ‚˜ λ‹€λ₯Έ μ œμ•½ λ“±μœΌλ‘œ μ§€κΈˆ λ‹Ήμž₯ νŒŒλ“œλ₯Ό μŠ€μΌ€μ€„ν•  수 μ—†λ‹€λŠ” 뜻

# kubelet으둜 μ»¨ν…Œμ΄λ„ˆ μ§„λ‹¨ν•˜κΈ°

kubelet이 μ»¨ν…Œμ΄λ„ˆλ₯Ό 주기적으둜 μ§„λ‹¨ν•˜λŠ”λ°, μ΄λ•Œ ν•„μš”ν•œ ν”„λ‘œλΈŒ(Probe)μ—λŠ” 두 가지 쑴재

  • livenessProbe: μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λλŠ”μ§€ 확인. 이 진단이 μ‹€νŒ¨ν•˜λ©΄ kubelet은 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ’…λ£Œμ‹œν‚€κ³ , μž¬μ‹œμž‘ 정책에 λ”°λΌμ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μž¬μ‹œμž‘
  • readinessProbe: μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λœ ν›„ μ‹€μ œλ‘œ μ„œλΉ„μŠ€ μš”μ²­μ— 응닡할 수 μžˆλŠ”μ§€ 진단. 이 진단이 μ‹€νŒ¨ν•˜λ©΄ μ—”λ“œν¬μΈνŠΈ μ»¨νŠΈλ‘€λŸ¬λŠ” ν•΄λ‹Ή νŒŒλ“œμ— μ—°κ²°λœ λͺ¨λ“  μ„œλΉ„μŠ€λ₯Ό λŒ€μƒμœΌλ‘œ μ—”λ“œν¬μΈ 정보λ₯Ό 제거

readinessProbeλ₯Ό μ§€μ›ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλΌλ©΄ μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λœ λ‹€μŒ λ°”λ‘œ μ„œλΉ„μŠ€μ— νˆ¬μž…λ˜μ–΄μ„œ νŠΈλž˜ν”½μ„ 받지 μ•Šκ³ , μ‹€μ œ νŠΈλž˜ν”½μ„ 받을 μ€€λΉ„κ°€ λ˜μ—ˆμŒμ„ ν™•μΈν•œ ν›„ νŠΈλž˜ν”½μ„ λ°›μŒ


# μ΄ˆκΈ°ν™” μ»¨ν…Œμ΄λ„ˆ

  • μ΄ˆκΈ°ν™” μ»¨ν…Œμ΄λ„ˆλŠ” μ•± μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ˜κΈ° μ „ νŒŒλ“œ μ΄ˆκΈ°ν™”
  • λ³΄μ•ˆμƒ 이유둜 μ•± μ»¨ν…Œμ΄λ„ˆ 이미지와 같이 두면 μ•ˆ λ˜λŠ” μ•±μ˜ μ†ŒμŠ€ μ½”λ“œλ₯Ό λ³„λ„λ‘œ 관리할 λ•Œ 유용

# νŠΉμ§•

  • μ΄ˆκΈ°ν™” μ»¨ν…Œμ΄λ„ˆ μ—¬λŸ¬ 개 ꡬ성 κ°€λŠ₯
  • μ΄ˆκΈ°ν™” μ»¨ν…Œμ΄λ„ˆ 싀행이 μ‹€νŒ¨ν•˜λ©΄ μ„±κ³΅ν• λ•Œ κΉŒμ§€ μž¬μ‹œμž‘
  • μ΄ˆκΈ°ν™” μ»¨ν…Œμ΄λ„ˆκ°€ λͺ¨λ‘ μ‹€ν–‰λœ ν›„ μ•± μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μ‹œμž‘
  • νŒŒλ“œκ°€ λͺ¨λ‘ μ€€λΉ„λ˜κΈ° 전에 μ‹€ν–‰ν•œ ν›„ μ’…λ£Œλ˜λŠ” μ»¨ν…Œμ΄λ„ˆμ΄κΈ° λ•Œλ¬Έμ— readinessaProbeλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŒ

# νŒŒλ“œ 인프라 μ»¨ν…Œμ΄λ„ˆ

  • μΏ λ²„λ„€ν‹°μŠ€μ—λŠ” λͺ¨λ“  νŒŒλ“œμ—μ„œ 항상 μ‹€ν–‰λ˜λŠ” pauseλΌλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μ‘΄μž¬ν•˜λŠ”λ° 이 pauseλ₯Ό 'νŒŒλ“œ 인프라 μ»¨ν…Œμ΄λ„ˆ'라고 함
  • pauseλŠ” νŒŒλ“œ μ•ˆ κΈ°λ³Έ λ„€νŠΈμ›Œν¬λ‘œ μ‹€ν–‰λ˜λ©°, ν”„λ‘œμ„ΈμŠ€ μ‹λ³„μžκ°€ 1(PID 1)둜 μ„€μ •λ˜λ―€λ‘œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ˜ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆ 역할을 함

# μŠ€νƒœν‹± νŒŒλ“œ

  • kube-apiseverλ₯Ό ν†΅ν•˜μ§€ μ•Šκ³  kubelet이 직접 μ‹€ν–‰ν•˜λŠ” νŒŒλ“œλ“€μ΄ μ‘΄μž¬ν•˜λŠ”λ° 이λ₯Ό μŠ€νƒœν‹± νŒŒλ“œλΌκ³  함
  • 보톡 μŠ€νƒœν‹± νŒŒλ“œλŠ” kube-apiserverλΌλ˜κ°€ etcd 같은 μ‹œμŠ€ν…œ νŒŒλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μš©λ„λ‘œ 많이 μ‚¬μš©
  • μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ νŒŒλ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ kube-apiserverκ°€ ν•„μš”ν•œλ° kube-apiserver 자체λ₯Ό 처음 μ‹€ν–‰ν•˜λŠ” λ³„λ„μ˜ μˆ˜λ‹¨μœΌλ‘œ μŠ€νƒœν‹± νŒŒλ“œ 이용

# νŒŒλ“œμ— CPU와 λ©”λͺ¨λ¦¬ μžμ› ν• λ‹Ή

  • λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜ 기반으둜 μ—¬λŸ¬ 개 μž‘μ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ…Έλ“œ ν•˜λ‚˜μ— μ—¬λŸ¬ 개 νŒŒλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 일이 쑴재
  • νŒŒλ“œμ—λŠ” CPU와 λ©”λͺ¨λ¦¬λ₯Ό λŒ€μƒμœΌλ‘œ μžμ› μ‚¬μš©λŸ‰μ„ μ„€μ •ν•˜λ„λ‘ .limit와 .request ν•„λ“œλ₯Ό μ€€λΉ„ν•΄λ‘μ—ˆμŒ
apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    resources:
      requests: # μ΅œμ†Œ μžμ› μš”κ΅¬λŸ‰
        cpu: 0.1
        memory: 200M
      limits:  # μ΅œλŒ€ μ‚¬μš© κ°€λŠ₯λŸ‰
        cpu: 0.5 # CPU μ½”μ–΄ μ—°μ‚° λŠ₯λ ₯ κΈ°μ€€
        memory: 1G # λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ μΈ‘μ •λ˜λ©°, λ‹¨μœ„ μš©λŸ‰ 기호 μ‚¬μš©κ°€λŠ₯
    ports:
    - containerPort: 8080

# νŒŒλ“œμ— ν™˜κ²½ λ³€μˆ˜ μ„€μ •ν•˜κΈ°

  • μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•  λ•Œμ˜ μž₯점 쀑 ν•˜λ‚˜λŠ” 개발 ν™˜κ²½μ—μ„œ λ§Œλ“  μ»¨ν…Œμ΄λ„ˆμ˜ ν™˜κ²½ λ³€μˆ˜λ§Œ λ³€κ²½ν•΄ μ‹€μ œ ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•˜λ”λΌλ„ 개발 ν™˜κ²½μ—μ„œ λ™μž‘ν•˜λ˜ κ·ΈλŒ€λ‘œ λ™μž‘ν•œλ‹€λŠ” 점
apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    ports:
    - containerPort: 8080
    env:
    - name: TESTENV01
      value: "testvalue01"
    - name: HOSTNAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    - name: CPU_REQUEST
      valueFrom:
        resourceFieldRef:
          containerName: kubernetes-simple-pod
          resource: requests.cpu
    - name: CPU_LIMIT
      valueFrom:
        resourceFieldRef:
          containerName: kubernetes-simple-pod
          resource: limits.cpu

# νŒŒλ“œ ꡬ성 νŒ¨ν„΄

  • νŒŒλ“œλ‘œ μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ¬Άμ–΄μ„œ κ΅¬μ„±ν•˜κ³  μ‹€ν–‰ν•  λ•Œ λͺ‡κ°€μ§€ νŒ¨ν„΄ 적용 κ°€λŠ₯

# μ‚¬μ΄λ“œμΉ΄ νŒ¨ν„΄

  • μ‚¬μ΄λ“œμΉ΄ νŒ¨ν„΄μ€ μ›λž˜ μ‚¬μš©ν•˜λ €λ˜ κΈ°λ³Έ μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λŠ₯을 ν™•μž₯ν•˜κ±°λ‚˜ κ°•ν™”ν•˜λŠ” μš©λ„μ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μΆ”κ°€ν•˜λŠ” 것
  • κΈ°λ³Έ μ»¨ν…Œμ΄λ„ˆλŠ” μ›λž˜ λͺ©μ μ˜ κΈ°λŠ₯μ—λ§Œ μΆ©μ‹€ν•˜λ„λ‘ κ΅¬μ„±ν•˜κ³ , λ‚˜λ¨Έμ§€ 곡톡 λΆ€κ°€ κΈ°λŠ₯듀은 μ‚¬μ΄λ“œμΉ΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μΆ”κ°€ν•΄μ„œ μ‚¬μš©
  • μ»¨ν…Œμ΄λ„ˆμ˜ μž¬μ‚¬μš©μ„±μ„ 높일 수 있음

# μ•°λ°°μ„œλ” νŒ¨ν„΄(Ambassador)

  • νŒŒλ“œ μ•ˆμ—μ„œ ν”„λ‘μ‹œ 역할을 ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μΆ”κ°€ν•˜λŠ” νŒ¨ν„΄
  • νŒŒλ“œ μ•ˆμ—μ„œ μ™ΈλΆ€ μ„œλ²„μ— μ ‘κ·Όν•  λ•Œ λ‚΄λΆ€ ν”„λ‘μ‹œμ— μ ‘κ·Όν•˜λ„λ‘ μ„€μ •ν•˜κ³  μ‹€μ œ μ™ΈλΆ€μ™€μ˜ 연결은 ν”„λ‘μ‹œμ—μ„œ μ•Œμ•„μ„œ 처리

# μ–΄λŒ‘ν„° νŒ¨ν„΄(Adapter)

  • νŒŒλ“œ μ™ΈλΆ€λ‘œ λ…ΈμΆœλ˜λŠ” 정보λ₯Ό ν‘œμ€€ν™”ν•˜λŠ” μ–΄λŒ‘ν„° μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 뜻
  • μ–΄λŒ‘ν„° μ»¨ν…Œμ΄λ„ˆλ‘œ νŒŒλ“œμ˜ λͺ¨λ‹ˆν„°λ§ μ§€ν‘œλ₯Ό ν‘œμ€€ν™”ν•œ ν˜•μ‹μœΌλ‘œ λ…ΈμΆœμ‹œν‚€κ³ , μ™ΈλΆ€μ˜ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμ—μ„œ ν•΄λ‹Ή 데이터λ₯Ό 주기적으둜 κ°€μ Έκ°€μ„œ λͺ¨λ‹ˆν„°λ§ν•˜λŠ”데 이용
  • μ˜€ν”ˆ μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμΈ ν”„λ‘œλ©”ν…Œμš°μŠ€μ—μ„œλ„ μ‚¬μš©

# Referenses

  • μΏ λ²„λ„€ν‹°μŠ€ μž…λ¬Έ - 90가지 예제둜 λ°°μš°λŠ” μ»¨ν…Œμ΄λ„ˆ 관리 μžλ™ν™” ν‘œμ€€ / λ™μ–‘λΆμŠ€
Last Updated: 8/12/2020, 1:33:42 PM